const api = require("../../../config/api")

// pages/MyList/upResult/upResult.js
Page({
    /**
     * 页面的初始数据
     */
    data: {
        // 控制录音框弹窗
        isRecording: false,
        // 录音管理器
        recorderManager: null, 
        // 附件采购界面购买的附件
        SelectAccessory: [],
        // 附件采购界面计算出来的总金额，初始状态时为0
        totalPrice: 0,
        // 工单编号
        workOrderCode: '',

        // 保存已经上传的图片
        ImgList: [],
        // 客户（单位）编号
        customerCode:'',
        //上报编号
        feedbackCode: '',
        // 检测文字描述
        testingContent: '',
        // 检测录音描述路径
        testingVoiceFile: '',
        // 检测图片描述路径
        testingImgFile: [],
        // 检测视频描述路径
        testingVideoFile: '',
        // testingTotal
        testingTotal: '',
        // 检测所选附件
        tarList: [],
    },

    // 上传视频
    onUploadVideo: function () {
        this.uploadFile({
          fileType: 'file', // 文件类型
          successCallback: (fileUrl) => {
            console.log('上传视频地址:', fileUrl);
            this.setData({
                testingVideoFile: fileUrl
            });
          },
          failCallback: (error) => {
            console.error('上传失败:', error);
          }
        });
      },


    //上传图片函数 
   onUploadImage1: function () {
    const maxCount = 9 - this.data.ImgList.length; // 剩余可上传的图片数量
    if (maxCount <= 0) {
      wx.showToast({
        title: '最多上传9张图片',
        icon: 'none'
      });
      return;
    }
    // 调用文件上传接口
    this.uploadFile({
      fileType: 'image', // 文件类型
      count: maxCount, // 本次允许选择的图片数量
      successCallback: (fileUrl) => {
        console.log('上传图片地址:', fileUrl);
        // 将新上传的图片 URL 添加到 ImgList 中，作为数组，方便循环渲染
        this.setData({
          ImgList: [...this.data.ImgList, fileUrl]
        });
      },
      failCallback: (error) => {
        console.error('上传失败:', error);
      }
    });
  },

uploadFile: function (options) {
  const {
    filePath,
    fileType, // 文件类型
    sourceType = ['album', 'camera'], // 选择文件来源
    count, // 可选择的文件数量
    name = 'file', // 后端接收文件的字段名
    successCallback, // 上传成功后的回调
    failCallback // 上传失败后的回调
  } = options;
  if (filePath) {
    console.log('已有文件')
    wx.uploadFile({
      url: api.uploadFile,
      filePath: filePath, // 本地文件路径
      name: name, // 后端接收文件的字段名
      success: (uploadResult) => {
        const data = JSON.parse(uploadResult.data);
        console.log('上传文件结果:', data);
        if (data.code === 200) {
          wx.showToast({
            title: '上传成功',
            icon: 'success'
          });
          if (typeof successCallback === 'function') {
            successCallback(data.data); // 执行成功回调，传入文件地址
          }
        } else {
          wx.showToast({
            title: data.message || '上传失败',
            icon: 'none'
          });
          if (typeof failCallback === 'function') {
            failCallback(data);
          }
        }
      },
      fail: (error) => {
        console.error('上传失败:', error);
        wx.showToast({
          title: '上传失败，请重试',
          icon: 'none'
        });
        if (typeof failCallback === 'function') {
          failCallback(error);
        }
      }
    });
  } else {
    console.log('选择文件')
    // 选择文件
    wx.chooseMedia({
      count: count, // 可以选择的数量
      mediaType: ['image', 'video'], // 媒体类型，可以是图片或视频
      sourceType: ['album', 'camera'], // 来源，相册或相机
      success: (chooseResult) => {
        const tempFiles = chooseResult.tempFiles; // 获取选择的所有文件
        console.log('选择的文件路径:', tempFiles);
        
        // 遍历所有选择的文件并逐个上传
        tempFiles.forEach((file, index) => {
          wx.uploadFile({
            url: api.uploadFile, // 上传接口
            filePath: file.tempFilePath, // 本地文件路径
            name: name, // 后端接收文件的字段名
            success: (uploadResult) => {
              const data = JSON.parse(uploadResult.data);
              console.log('上传文件结果:', data);
              if (data.code === 200) {
                wx.showToast({
                  title: '上传成功',
                  icon: 'success'
                });
                if (typeof successCallback === 'function') {
                  successCallback(data.data); // 执行成功回调，传入文件地址
                }
              } else {
                wx.showToast({
                  title: data.message || '上传失败',
                  icon: 'none'
                });
                if (typeof failCallback === 'function') {
                  failCallback(data);
                }
              }
            },
            fail: (error) => {
              console.error('上传失败:', error);
              wx.showToast({
                title: '上传失败，请重试',
                icon: 'none'
              });
              if (typeof failCallback === 'function') {
                failCallback(error);
              }
            }
          });
        });
      },
      fail: (err) => {
        console.error('选择媒体失败:', err);
        wx.showToast({
          title: '选择媒体失败',
          icon: 'none'
        });
        if (typeof failCallback === 'function') {
          failCallback(err);
        }
      }
    });
  }
},
// 删除图片
  onDeleteImage: function (e) {
        const index = e.currentTarget.dataset.index; // 获取要删除的图片索引
        const updatedImgList = [...this.data.ImgList];
        updatedImgList.splice(index, 1); // 删除指定索引的图片
    
        this.setData({
          ImgList: updatedImgList
        });
    
        wx.showToast({
          title: '图片已删除',
          icon: 'none'
        });
      },

    // 手动输入故障内容
    
    doInputContent(e){
        this.setData({
            testingContent: e.detail.value
        });
    },

    // 选择录音方式
    onChooseAudio: function () {
        const that = this;
        wx.showActionSheet({
          itemList: ['现场录音上传', '上传文件中的音频'], // 弹窗选项
          success: function (res) {
            if (res.tapIndex === 0) {
              that.recordAndUpload(); // 现场录音
            } else if (res.tapIndex === 1) {
              that.onUploadVoice(); // 从文件中选择音频
            }
          },
          fail: function (err) {
            console.log('用户取消选择', err);
          }
        });
      },

    // 现场录音并上传
    recordAndUpload: function () {
        const that = this;
        // const recorderManager = wx.getRecorderManager();

        // recorderManager.onStart(() => {
        //   wx.showToast({
        //     title: '录音开始',
        //     icon: 'none'
        //   });
        // });
        this.recordStart();
        // recorderManager.onStop((res) => {
        //   const tempFilePath = res.tempFilePath; // 获取录音文件路径
        //   console.log('录音结束，临时文件路径:', tempFilePath);

        //   // 上传录音文件
        //   that.uploadFile({
        //     filePath: tempFilePath,
        //     successCallback: (data) => {
        //       console.log('录音上传成功:', data);
        //       this.setData({
        //         'feedbackData.feedbackVoiceFile':data
        //       })
        //     }
        //   });
        // });

        // // 开始录音
        // recorderManager.start({
        //   duration: 6000, // 最长录音时间，单位 ms
        //   sampleRate: 16000,
        //   numberOfChannels: 1,
        //   encodeBitRate: 96000,
        //   format: 'mp3' // 或 'aac'
        // });
    },

    onUploadVoice: function () {
        this.uploadFile({
          fileType: 'file', // 文件类型
          successCallback: (fileUrl) => {
            console.log('上传录音地址:', fileUrl);
            this.setData({
              testingVoiceFile: fileUrl
            });
          },
          failCallback: (error) => {
            console.error('上传失败:', error);
          }
        });
      },

    initRecord:function(){
    const recorderManager = wx.getRecorderManager();

    recorderManager.onStart(() => {
      console.log('录音开始');
    });

    recorderManager.onPause(() => {
      console.log('录音暂停');
    });

    recorderManager.onResume(() => {
      console.log('录音继续');
    });

    recorderManager.onStop((res) => {
      console.log('录音结束，临时文件路径:', res.tempFilePath);
      this.setData({
        tempAudioPath: res.tempFilePath,
        isRecording: false // 关闭弹框
      });
      this.uploadFile({
        filePath: res.tempFilePath,
        successCallback: (data) => {
          this.setData({
            testingVoiceFile:data
          })
          console.log('录音上传成功:', data);
        }
      });
    });

    this.setData({ recorderManager });
  },

    // 启动录音并显示弹框
    recordStart: function () {
        this.data.recorderManager.start({
        duration: 60000, // 最长录音时间
        sampleRate: 16000,
        numberOfChannels: 1,
        encodeBitRate: 96000,
        format: 'mp3' // 可选：aac
        });
        const that = this;
        wx.showModal({
        title: '录音中...',
        content: '您可以暂停、继续或结束录音。',
        showCancel: true, // 是否显示取消按钮
        cancelText: '取消', // 取消按钮文字
        confirmText: '结束', // 确定按钮文字
        success: (res) =>  {
            if (res.confirm) {
            console.log('用户点击了结束录音');
            // 调用结束录音逻辑
            that.stopRecording();
            } else if (res.cancel) {
            console.log('用户取消了暂停录音');
            // 调用暂停录音逻辑
            that.stopRecording();
            }
        },
        fail(err) {
            console.error('模态框显示失败', err);
        }
        });
    },

    // 暂停录音
    pauseRecording: function () {
        this.data.recorderManager.pause();
    },

    // 继续录音
    resumeRecording: function () {
        this.data.recorderManager.resume();
    },

    // 停止录音
    stopRecording: function () {
        this.data.recorderManager.stop();
        // 上传录音文件
    },

    toLastPage: function(){
        if(this.data.ImgList.length < 1){
            wx.showToast({
              title: '上传图片少于一张',
              icon: 'none',
            })
            return;
        }
        // 把已经上传的图片数组传给testingImgFile这个数组
        this.setData({
            // 本页定义时，testingImgFile为数组类型
            testingImgFile: this.data.ImgList
        });
        // 把数组中的元素（url的字符串）进行拼接成一个字符串urls
        var imgUrlStr = '';
        // 由于imgUrlStr初始时为空，所以urls的开头会有两个&&
        for (var img in this.data.testingImgFile) {
            imgUrlStr = imgUrlStr + '&&' + this.data.testingImgFile[img]
        }
        wx.request({
            url: api.addTesting,
            method: 'POST',
            data:{
              customerCode: this.data.customerCode,
              feedbackCode: this.data.feedbackCode,
              workOrderCode: this.data.workOrderCode,
              testingContent: this.data.testingContent,
              testingVoiceFile: this.data.testingVoiceFile,
              testingVideoFile: this.data.testingVideoFile,
              // 传给后台的参数中，testingImgFile的接收类型为字符串
              testingImgFile: imgUrlStr.substring(2,imgUrlStr.length), // 去掉开头的'&&'
              testingTotal: this.data.totalPrice,
              tarList: this.data.SelectAccessory,
            },
            success: (res) => {
                if(res.data.code == 200){
                    console.log('提交成功')
                  wx.showToast({
                      title: '提交成功',
                      icon: 'none'
                  })
                  wx.navigateBack({
                    delta: 1,
                    // 利用箭头函数，自动绑定正确的this
                    success: () => {
                        // 回传参数
                        var that = this;
                        const pages = getCurrentPages(); // 获取当前页面栈
                        const prevPage = pages[pages.length - 2]; // 获取上一个页面
                        // 点击提交后，会返回上一个页面（订单详情），此时需要重新传递一次订单号，目的是为了，在重新渲染该页面时，能够获取到最新的订单状态，以此来更新底部按钮的状态
                        if (prevPage) {
                            prevPage.setData({
                                // that表示在订单详情页面更新工单号
                                workOrderCode: that.data.workOrderCode // 更新订单号
                            });
                        }
                    }
                });
                }else{
                    wx.showToast({
                      title: res.data.mesage,
                      icon: 'none'
                    })
                    
                }
            },
            fail(){
                wx.showToast({
                  title: 'Fail提交失败',
                  icon: 'none'
                })
                
            },
          })
        // //   返回到上一页之后，如何让页面自动刷新一次，使他获得最新的订单状态
        // wx.navigateBack({})
    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad(options) {
        this.initRecord();
        // 从订单详情页跳转过来，并把工单编号、客户编号、上报编号传过来
        if(options.workOrderCode){
            const workOrderCode = options.workOrderCode
            const customerCode = options.customerCode
            const feedbackCode = options.feedbackCode
            this.setData({
                workOrderCode: workOrderCode,
                customerCode: customerCode,
                feedbackCode: feedbackCode
            })
            console.log('workOrderCode', this.data.workOrderCode)
        }

        // if(options.totalPrice){
        //     // 从Buy页面传递过来的数据(含工单编号)
        //     // 解码并还原为字符串  
        //     const SelectAccessory = decodeURIComponent(options.SelectAccessory);  
        //     const totalPrice = options.totalPrice;
        //     const work = options.work; // 工单编号
        //     // 更新本页的SelectAccessory和totalPrice
        //     this.setData({
        //         // JSON.parse(SelectAccessory)把传过来的数组复原,并把内容赋值给本页的SelectAccessory
        //         SelectAccessory: JSON.parse(SelectAccessory),
        //         totalPrice: totalPrice,
        //         workOrderCode: work,
        //     });
        //     console.log('传过来的订购附件数组', this.data.SelectAccessory)
        // }
        
    },

    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady() {

    },

    /**
     * 生命周期函数--监听页面显示
     */
    onShow() {
        /** 在这里接收BUY.JS 回传的数据，然后赋值*/

        // 由于从附件采购界面返回到上传检测结果界面时，上传检测结果界面不是第一次渲染，所以此处是在返回该页面时，也会进行监听页面，并重新渲染页面
        // 这里传回的selectAccessory是一个编码后的数组，传回来的时候，需要解码
        if(null != this.data.selectAccessory){
            // 在BUY界面的时候，在执行跳转函数前，就给本页面的SelectAccessory，totalPrice，workOrderCode赋好值了，可以直接使用
            const SelectAccessory = decodeURIComponent(this.data.selectAccessory);  
            const totalPrice = this.data.totalPrice;
            const work = this.data.workOrderCode;    // 订单编号
            // 更新本页的SelectAccessory和totalPrice
            this.setData({
                // JSON.parse(SelectAccessory)把传过来的数组复原,并把内容赋值给本页的SelectAccessory
                SelectAccessory: JSON.parse(SelectAccessory),
                totalPrice: totalPrice,
                workOrderCode: work,
            });
            console.log('回传过来的订购附件数组', this.data.SelectAccessory)
        }
    },

    /**
     * 生命周期函数--监听页面隐藏
     */
    onHide() {

    },

    /**
     * 生命周期函数--监听页面卸载
     */
    onUnload() {

    },

    /**
     * 页面相关事件处理函数--监听用户下拉动作
     */
    onPullDownRefresh() {

    },

    /**
     * 页面上拉触底事件的处理函数
     */
    onReachBottom() {

    },

    /**
     * 用户点击右上角分享
     */
    onShareAppMessage() {

    },

    /**
     * 跳转添加附件
     */
    toBuy: function(){
        // 跳转到购买页面也会传递工单号
      console.log('跳转到Buy页面前，订单编号', this.data.workOrderCode)
      wx.navigateTo({
        url: `/pages/MyList/Buy/Buy?workOrder=${this.data.workOrderCode}`
      });
    },

    /**
     * 返回上一页
     */
    toBack: function(){
      wx.navigateBack();
    },
})